home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ppp / DialupPPP.doc < prev    next >
Text File  |  1992-07-24  |  67KB  |  1,652 lines

  1.                 Dialup PPP
  2.                 Release 2.2
  3.                 Kirk Smith
  4.                 Purdue University
  5.                 June 1992
  6.  
  7. 1.  Introduction
  8.  
  9. 1.1 General
  10.  
  11. This software was developed to provide dialup on demand PPP over high
  12. speed modems.  In many situations, leased lines are used to provide
  13. TCP/IP links over significant distances.  With the advent of V.32bis
  14. modems, and with this software, another alternative exists.  It
  15. appears to the application that the modems remain connected all the
  16. time (like a leased line). In reality, however, they disconnect
  17. whenever there is no traffic. When a packet arrives at the interface
  18. to be transmitted, and the modems are not connected, a connection is
  19. made and the packets begin to flow again.
  20.  
  21. 1.2 Audience
  22.  
  23. This file contains information for those intending to install and use
  24. dp (Dialup PPP), and is not aimed at teaching you about TCP/IP networking,
  25. although subjects which may be new to you such as routing and nameservers
  26. will be covered.
  27.  
  28. 1.3 History
  29.  
  30. The base for this software is several other free packages that have
  31. been modified to support this purpose.  The dialup code came from the
  32. BBN Dialup Slip.  The PPP program is from Carnegie Mellon University. The
  33. kernel PPP streams driver came from Brad K. Clements. The TCP/IP
  34. header compression support came from Van Jacobson from the University
  35. of California.  Kirk Smith at Purdue University assembled all these
  36. pieces, made them all work together, and added a number of features
  37. beyond the original software.
  38.  
  39. 1.4 Release Notes
  40.  
  41. 1.4.1 Supported Platforms
  42.  
  43. The software has been running on SunOS 4.1.1 and works quite well. It
  44. will probably not work on anything but SunOS4 (Solaris 1.0). It
  45. relies on STREAMS support.  It is possible to make it work in a
  46. non-streams environment, but this has not done that. The latest
  47. version of the PPP (non-dial on demand) has support for 386BSD, and
  48. this platform may be supported soon.
  49.  
  50. 1.5 Commercial Software
  51.  
  52. Companies sell products that do things similar to this.  I believe
  53. that this software incorporates some unique features and has value in
  54. itself. However, if you want a supported product, you might want to
  55. shop around. Morning Star Technologies is one company that I know of.
  56. Try sending mail to marketing@morningstar.com for more information. 
  57. From what I can tell, they have a top notch product and top notch
  58. support.
  59.  
  60. A mailing list "dplist@phoenix.acn.purdue.edu" is available.  To
  61. subscribe to this list, send a message to
  62. "dplist-request@phoenix.acn.purdue.edu". This list is a group of
  63. people either using or thinking about using this software.
  64.  
  65. 2. Operational Overview
  66.  
  67. The software known as Dialup PPP (or dp-2.2) consists of several
  68. distinct modules.  This section will discuss how the modules fit
  69. together and then will describe each module in more detail.
  70.  
  71. From the application standpoint, this software implements a network
  72. interface.  Ethernet interfaces have names like ie0, le0, or le1,
  73. etc. This interface has a name like dp0, dp1, dp2, etc.  While
  74. ethernets are "Broadcast" networks, these is a "Point to Point"
  75. networks.  This is important to consider when dealing with address
  76. assignment and routing. In short, when you "ifconfig" a point to
  77. point interface, you must provide an IP address for both the source
  78. and destination.  Routes to the network never exist, but routes to
  79. both ends of the interface may exist. For more information on this,
  80. refer to the manual pages on ifconfig(8c), route(8c), and routed(8c).
  81.  
  82. This network is always "UP" from the perspective of "ifconfig". Under
  83. normal conditions, network applications like "telnet" or "ftp" will
  84. always see a network that is up, even if there is a slight delay
  85. while modems are re-connected.
  86.  
  87. 2.1 Normal Operation
  88.  
  89. If the modems are connected, this network interface looks like a
  90. dedicated leased line Point to Point interface.  Packets flow from
  91. the kernel networking software to the appropriate "dp" interface. 
  92. The kernel driver for that interface consists primarily of the "dpif"
  93. streams module.  The packets then become streams messages and are
  94. passed to the "pppasync" module. This module encapsulates the packets
  95. according to the PPP specification, including the addition of a frame
  96. check sum.  It then passes the packets on to the streams driver of
  97. the particular serial port hardware.  The serial hardware passes the
  98. byte stream onto the modem and out into the public telephone system.
  99.  
  100. In addition, packets can be sent from the user level PPP program
  101. (called dp). These packets are sent through the "dpif" streams module
  102. and on to the "pppasync" module where they are encapsulated,
  103. checksummed, and passed to the serial port streams hardware to the
  104. modem.
  105.  
  106. On the other end, incoming bytes are received by the serial port
  107. streams driver and passed on to the "pppasync" streams module.  This
  108. module collects the bytes together into packets and rejects packets
  109. with bad checksums according to the PPP specification.  Then, packets
  110. are passed on to the "dpif" streams module where they are identified
  111. as being either IP packets or control packets.  IP packets are passed
  112. through the "dp" interface to the kernel TCP/IP modules.  PPP control
  113. packets are passed off to a user level PPP process for further
  114. interpretation.
  115.  
  116. This series of modules basically multiplexes and demultiplexes
  117. packets from the PPP programs and the kernel networking on both ends.
  118.  
  119. 2.2 Establishing Modem Connections
  120.  
  121. Assume, for now, that the network is properly configured, and the
  122. modems are not currently connected.  When packets arrive at the
  123. interface to be transmitted to the other end, there is no "dpif"
  124. stream associated with the interface. There is no specific serial
  125. port associated with the network interface at this time.  This
  126. corresponds to the DISCON (disconnected) state.  The packet is placed
  127. in a network queue awaiting a successful connection.
  128.  
  129. A request is assembled for this packet.  The request is a separate
  130. streams message which includes the interface name, the interface unit
  131. number, a flag indicating to check authorization, the destination
  132. address, a copy of the IP header and the next 4 bytes of the packet. 
  133. In both TCP and UDP, these next 4 bytes indicate source and
  134. destination ports. This request is sent to a user level program
  135. called "dpd" (Dialup PPP Daemon) through another streams device
  136. accessed through "/dev/dp0". If "dpd" is not running or not accepting
  137. messages on "/dev/dp0", then the networking code immediately returns
  138. ENETDOWN (network down). Otherwise, the WAITING state is entered and
  139. packets continue to be queued until the call completes.
  140.  
  141. When the "dpd" program is started, it reads the configuration file
  142. "/etc/dp/config/dp-conf".  This contains information about each
  143. network interface and each available modem.  So, when the request
  144. arrives, the "dpd" program checks for authorization according to
  145. the interface configuration.  If a call is not permitted, a FAILURE
  146. status is returned to the network interface.  Otherwise, dpd reports
  147. a CALL_IN_PROGRESS status and creates a child process to handle this
  148. call.
  149.  
  150. An appropriate modem is selected according to the configuration (this
  151. will be explained in more detail later), and the call is placed using
  152. the appropriate dial script.  Once the call completes, the
  153. appropriate login script is used to log into the remote computer.  A
  154. special account is set up on the remote computer that uses the login
  155. shell "/usr/etc/dplogin". This program reads the configuration in
  156. "/etc/dp/config/dp-conf", performs simple synchronization with the
  157. "dpd" at the other end and sets the call status to CALL_IN_PROGRESS.
  158.  
  159. Both the "dpd" and "dplogin" programs start the "/usr/etc/dp" program
  160. on both ends.  They negotiate all the options according to their own
  161. configuration. Once they have completed their negotiations, they
  162. report the SUCCESS call status and mark the network interfaces as
  163. ACTIVE.
  164.  
  165. If a call FAILURE status is reported, or a call wait timeout expires,
  166. the interface is marked with FAILEDCALL status.  After an appropriate
  167. timeout, the interface moves back to a DISCON status.  This enforces
  168. a minimum time between call attempts.  However, if the call failed
  169. because no modem was available, dpd reports a special NO_MODEM status
  170. which is similar to FAILURE status except the interface immediately
  171. moves to the DISCON status so that further call attempts can be made.
  172.  
  173. 2.2 Timing Out Modem Connections
  174.  
  175. Several timeouts can be specified in the configuration file
  176. "/etc/dp/config/dp-conf".  Among those are the timeouts which govern
  177. when the modems should be disconnected.  These timeouts are handled
  178. by the kernel "dpif" module.  When the kernel decides to disconnect a
  179. given interface, it sends a hangup signal (SIGHUP) to the "dp"
  180. process which shuts down the link.  The operation of each timer will
  181. be described. Each timeout is given in seconds and is specified in
  182. the configuration file. We have found that this particular
  183. combination of timers is highly effective in our typical use.  It
  184. allows reasonable timeouts for interactive use, while quickly timing
  185. out calls that were made for batch operations.
  186.  
  187. 2.2.1 Inactivity Timer
  188.  
  189. The simplest timeout mechanism is the inactivity timeout.  If no
  190. packets have been sent or received within a given time interval, then
  191. the modems are disconnected.  This is usually relatively long,
  192. roughly on the order of 2 to 3 minutes.
  193.  
  194. 2.2.2 TCP Close Timer
  195.  
  196. The kernel keeps track of TCP/IP connections.  Each TCP/IP connection
  197. is characterized by a distinct source and destination address and
  198. port. During the life of a TCP/IP connection, packets are exchanged
  199. with certain bits set in the header to indicate the creation and
  200. deletion of these logical connections.  The interesting parts of the
  201. header are the SYN, FIN, and RST bits.  The software monitors the
  202. TCP/IP connections in progress.  By noting the passage of SYN, FIN,
  203. and RST bits in TCP/IP headers, we keep a count of the number of
  204. active TCP/IP connections. When that connection count goes to zero,
  205. we assume that everyone has finished using the network interface for
  206. now, and a fast timeout is enabled. This shorter timeout will
  207. disconnect the modems if no packets are sent or received over an
  208. interval shorter than the normal inactivity timeouts. We have set
  209. this interval as small as 5 seconds and it works quite well
  210.  
  211. 2.2.3 Non TCP Timer
  212.  
  213. Not every network application uses TCP, so consideration is made for
  214. that case. In the case of no TCP connections, but non-TCP traffic is
  215. flowing, a separate inactivity timeout can be specified.  This is
  216. usually on the same order as the TCP Close timer, but perhaps a
  217. little longer depending on the applications in use.
  218.  
  219. 3. Source Code Overview
  220.  
  221. 3.1 "h" directory
  222.  
  223. This directory contains include files that are used by several of the
  224. programs that comprise this distribution.  The files dp_str.h,
  225. if_ppp.h, ppp_str.h, slcompress.h, and slip_var.h need to be copied to
  226. /usr/sys/sys as part of the kernel build procedure.
  227.  
  228. 3.2 "dp" directory
  229.  
  230. This directory contains a slightly modified version of the CMU PPP
  231. code. In release 2.0, it was based on "ppp" patch level 4, but under
  232. release 2.2, it is based on "ppp" patch level 6.
  233.  
  234. The modifications to the standard PPP are small, but are necessary
  235. for this mode of operation.  The "dp" program takes all the flags
  236. that apply to the "ppp" program.  In addition, if the "dialup" flag
  237. is given to dp, it modifies the behavior in the following ways:
  238.  
  239. - The name of the network interface is dp0, dp1, etc., instead of
  240. ppp0, ppp1, etc.
  241.  
  242. - When an interface is brought up, it executes a SIOCCALLSTAT ioctl
  243. which is specific to the dialup PPP software.
  244.  
  245. - When a normal PPP interface is brought down, it marks the network
  246. interface as DOWN and removes the appropriate route.  For dialup PPP
  247. interfaces, however, the interface always appears to be UP and the
  248. route remains installed.
  249.  
  250. 3.3 "dpd" directory
  251.  
  252. This is originally based on the diald program from BBN.  It has been
  253. heavily modified to handle PPP rather than slip, and to handle the
  254. different kernel interfaces.  This section will describe the major
  255. differences in functionality.
  256.  
  257. The BBN code had a good expect script capability for doing the
  258. dialing. This capability has been expanded somewhat to allow better
  259. error handling. The "recv" directive has been modified to accept any
  260. number of alternative strings.  One use this to accept all known
  261. return codes from the modem. In addition, the timeout value on the
  262. "recv" can now take on a value of 0. This means to only receive input
  263. that has been already received when the "recv" is executed.  Use of a
  264. "replay" followed by a "recv "string" 0" will immediately either succeed
  265. or fail based on input received since the last "mark". An example of this
  266. is the following:
  267.  
  268.     mark
  269.     {
  270.     alternate
  271.         recv "CONNECT" "BUSY" "NO CARRIER" 30
  272.     alternate
  273.         log "Modem Timeout"
  274.         abort
  275.     }
  276.     {
  277.     alternate
  278.         replay
  279.         recv "CONNECT" 0
  280.         go
  281.     alternate
  282.         replay
  283.         recv "BUSY" 0
  284.         log "Busy"
  285.         abort
  286.     alternate
  287.         replay
  288.         recv "NO CARRIER" 0
  289.         log "No Carrier"
  290.         abort
  291.     }
  292.  
  293. This segment of a script will wait up to 30 seconds to accept either
  294. "CONNECT", "BUSY", or "NO CARRIER", then immediately do the correct
  295. branch.  This was impossible to handle in a timely way using the
  296. original code.
  297.  
  298. The connection requests sent from the kernel to the "dpd" program can
  299. include more than the IP header.  This was done to accomodate any
  300. future enhancements that would screen connection requests based on
  301. TCP or UDP port numbers.
  302.  
  303. The uucp locking conventions have been updated to match those in use
  304. by the Sun version of uucp.  This is important to allow several
  305. programs to share the available modems with the kernel networking.
  306.  
  307. A new flexible configuration file allows setting of many new options.
  308. There will be section devoted to this configuration file which will
  309. describe the options in detail.
  310.  
  311. The timeout mechanisms have been expanded.  A "call wait" timeout is
  312. supported for the maximum waiting period between a call request and
  313. the completion of the call.  Once a call has failed, a "failed call"
  314. timeout indicates the time to wait before initiating a new call. The
  315. activity timeout is represented by one of 3 timeouts including
  316. "inactivity", "tcp close", and "non tcp", representing the conditions
  317. when TCP connections are active, no TCP connections are active, and
  318. non TCP traffic is active.
  319.  
  320. The concept of a modem has been expanded to include a modem rotary. A
  321. rotary is a group of modems that are used in a round robin fashion.
  322. With a bank of modems and phone lines, there are basically two ways
  323. to pick which modem to use next:  "first available" and "next
  324. available". The "next available" option corresponds to a "rotary", a
  325. round robin selection, and can be used in order to be more tolerant
  326. of a single modem or phone failure.  Given modems 1 to N, if modem
  327. number 1 fails, the "first available" selection will always fail and
  328. the "next available" selection will fail 1 out of N times.
  329.  
  330. SunOS allows use of a single modem for both dial in and dial out
  331. through the use of two minor device numbers for each port.  This
  332. facility has been completely integrated into this software so that a
  333. single port can be easily used for both incoming and outgoing calls.
  334.  
  335. A new program "dplogin" is included which shares a number of
  336. functions with "dpd".  "dplogin" is used as a login shell for
  337. incoming calls and uses the same configuration file as "dpd".  It
  338. handles locking and logging in a compatible way.
  339.  
  340. A call log file is now generated for both incoming and outgoing
  341. calls. Each line of the file corresponds to a successful call and
  342. includes the following information: remote site name, tty device,
  343. date and time of initiation of connection, total connect time,
  344. initiating program (dpd or dplogin), protocol and port of initiating
  345. request (like tcp/smtp), and for both input and output, a report is
  346. given of number of packets, bytes, and errors. The protocol and port
  347. information is only available for outgoing calls.  This information
  348. can be very useful for analyzing call patterns and minimizing costs.
  349.  
  350. An auxiliary program facility is provided.  If so configured,
  351. whenever a modem connection is made, an auxiliary program can be
  352. run.  This program could, for instance, check queues for outgoing
  353. traffic and make use of the the connection to transfer mail, print
  354. jobs, or other similar queued files. This could be easily tuned to be
  355. site specific to reduce the number of calls made by taking advantage
  356. of connections when they happen.
  357.  
  358. 3.4 "sys" directory
  359.  
  360. The sys directory includes the kernel modules, including the
  361. following:
  362.  
  363. 3.4.1 ppp_async.c
  364.  
  365. The "pppasync" streams module, which is used in conjunction with
  366. both the original "pppif" module and the new "dpif" module.
  367.  
  368. 3.4.2 dp_if.c
  369.  
  370. The new version of ppp_if.c which has been heavily modified to
  371. support the dialup on demand mode of operation. dp_if.c is based
  372. originally on the ppp_if.c module from Clarkson University and Brad
  373. Clements.  It has been expanded in several ways.
  374.  
  375. The connection status of each interface is now handled and a number
  376. of timeouts are implemented.  The timeouts include the following:
  377.  
  378. callwait:    time to wait for a call to complete
  379. failedcall:    time to wait before trying another call
  380. inactivity:    disconnect after no packets in A seconds.
  381. tcp_close:    disconnect C seconds after last TCP connection is closed
  382.         and no packets.
  383. non_tcp:    disconnect U seconds after last non-TCP packet given no
  384.         activity and no TCP connections.
  385.  
  386. The timeouts can be set from the dp configuration file.
  387.  
  388. In addition, a completely new module keeps track of TCP connections
  389. in progress and will notice when all connections close and the line
  390. can be disconnected using one of the "fast timeouts" (tcp_close or
  391. non_tcp).
  392.  
  393. The Van Jacobson header compression code is included and works well
  394. with this package.
  395.  
  396. Included within dp_if.c is a driver for the "pppdial" streams device
  397. that allows the kernel to request the initiation of calls from the
  398. "dpd" program.
  399.  
  400. 3.5 "dptrace" directory
  401.  
  402. Dptrace is a simple program that prints the request trace file.  As
  403. each dialup request arrives through /dev/dp0, the dpd program writes
  404. the current time and the current request to the file
  405. "/var/adm/dp/req.trace". This program reads that file and formats the
  406. requests into a readable format. The program can be helpful in
  407. debugging and tuning the network.
  408.  
  409. 3.6 "modem" directory
  410.  
  411. This directory contains a program to set modem options on Hayes
  412. compatible modems.  The "setmodem" command can be invoked as:
  413.  
  414.     setmodem [-v] scriptfile device [baud]
  415.  
  416. Scriptfile contains a number of AT commands that will be fed to the
  417. modem. The setmodem program knows enough to expect OK returns from
  418. the modem and waits until the OK to proceed to the next AT command.
  419.  
  420. Scripts for the telebit T1600, T3000, and WorldBlazer modems are provided
  421. and have been tested.  You can modify these further to suit your configuration.
  422.  
  423. In addition, there is a shell script "initmodem.sh" which can be
  424. invoked as:
  425.  
  426.     initmodem scriptfile outdev indev [baud]
  427.  
  428. The scriptfile is the same as in setmodem, and the outdev corresponds
  429. to the device in setmodem, but the indev is the login side of the
  430. same device that is given in /etc/ttytab.  This script first edits
  431. /etc/ttytab to turn the login off for that port.  This allows
  432. everything to work correctly with the softcarrier options, etc.  The
  433. program resets the port before completion and generally is the preferred
  434. way to handle the initialization of devices.
  435.  
  436. 3.7 "aux" directory
  437.  
  438. The aux directory contains the sources for auxiliary programs that
  439. can be run when connections are established.  If so configured in the
  440. "/etc/dp/config/dp-conf" file, whenever a modem connection is made,
  441. an auxiliary program can be run.
  442.  
  443. Currently, the only program provided is a program called ckmailq.
  444. This looks in the mail spool directory for outgoing mail that is not
  445. currently being processed.  If such mail exists, it starts up
  446. sendmail with the proper options.
  447.  
  448. Other similar programs could be written for other queued traffic such
  449. as print jobs or uucp requests.  This can be used to "poll" for SMTP
  450. mail when a remote site can't initiate calls on it's own.
  451.  
  452. 4. Building & Installation
  453.  
  454. In this release there are two ways to install dp. One is to use the
  455. loadable module support in the current version, but this has known
  456. problems with unloading (which may not be a problem in most situations).
  457. The other method is to install the dp drivers directly into the kernel
  458. with a kernel rebuild.  This option will go away with Solaris 2.0, but
  459. works quite will under Solaris 1.0, and has no known problems.
  460. In the end, you will need to use the method that is most appropriate
  461. in your situation. Below, both methods are covered in detail.
  462.  
  463. In either case, the rest of dp must be built and installed in the way
  464. given below.
  465.  
  466. 4.1 Loadable Module Version Install
  467.  
  468. 4.1.1 Building & Installing
  469.  
  470. In most cases, for SunOS 4.1.x at least, dp should build "out of the
  471. box", and you should just do this:
  472.  
  473. *    According to local policy, create a new group called "ppp", we
  474.     suggest an id of 600. This would normally be done by adding an entry
  475.     to "/etc/groups" or adding an entry on the NIS master if you use
  476.     that. For more details see section XXX.
  477.  
  478. *    Unpack the distribution, which creates a directory called dp-2.2/
  479.  
  480. *    cd to dp-2.2/
  481.  
  482. *    type "make" and make sure there were no errors, then
  483.  
  484. *    Become "root", and type "make install", which will create all the
  485.     necessary directories and copy the files required across setting the
  486.     correct ownerships and permissions.
  487.  
  488. 4.1.2 Using Loadable DP
  489.  
  490. For general configuration details you should proceed to section XXX,
  491. but in addition you have to set up your system to load the modules at
  492. some stage, usually at boot time. To run from "/etc/rc.local" you
  493. should add the following lines to the file:
  494.  
  495.     if [ -f /etc/dp/script/startdp ]; then
  496.         /etc/dp/script/startdp
  497.         echo "started dialup PPP"
  498.     fi
  499.  
  500. 4.2 In-Kernel Version Install
  501.  
  502. For whatever reason, it may be necessary to install the dp modules in
  503. the kernel. The main reason is that the loadable modules are not
  504. fully supported at this release, or local policy may curtail the use
  505. of them in future release. This section goes through manual
  506. installation procedure.
  507.  
  508. The dp network interface must be installed in the kernel. To install
  509. this software, we must reconfigure, rebuild, and reboot with a new
  510. kernel (/vmunix).
  511.  
  512. 4.2.1 /usr/sys/conf.common/files.cmn
  513.  
  514. So that the "config" program knows where to find the drivers, the
  515. following lines must be added to the end of the file
  516. "/usr/sys/conf.common/files.cmn":
  517.  
  518.     os/dp_if.c        optional dp
  519.     os/ppp_async.c        optional dp
  520.  
  521. 4.2.2 /usr/sys/sun/conf.c
  522.  
  523. This file will contain the description of the pppdial streams
  524. device. This device allows communication between the kernel network
  525. interface and a user program "dpd" which makes calls and establishes
  526. connections.
  527.  
  528. Before the definition of the cdevsw array, a number of #defines are
  529. set up for each device.  After the last such setup and before the
  530. cdevsw array, place the following lines:
  531.  
  532. #include "dp.h"        /* Dialup PPP */
  533. #if NDP > 0
  534. extern struct streamtab ppp_dialinfo;
  535. #define    dptab    &ppp_dialinfo
  536. #else
  537. #define    dptab    0
  538. #endif
  539.  
  540. The cdevsw array contains an entry for each supported device.  The
  541. supported devices and the number of such devices varies somewhat from
  542. release to release. In SunOS4.1.1, the last supported device is 103,
  543. as indicated in a comment to the right of the device definition. 
  544. Assuming no other local devices, then, the Dialup PPP device would be
  545. device number 104 and defined as follows:
  546.  
  547.     {    /* Dialup PPP */
  548.     nodev,    nodev,    nodev,    nodev,        /*104*/
  549.     nodev,    nodev,    nodev,    0,     dptab,    0,
  550.     },
  551.  
  552. The exact position in the array does not really matter as long as you
  553. use the correct number when you create the device.  In this case, 104
  554. is the major number of the device and will be used later when the
  555. device is created.
  556.  
  557. 4.2.3 /usr/sys/sun/str_conf.c
  558.  
  559. This file defines the 3 streams modules involved.  Dialup PPP uses
  560. "dpif", "pppdial", and "pppasync".
  561.  
  562. Near the beginning of the file, there are a number of #include
  563. directives. After the last one, place the following line:
  564.  
  565.     #include "dp.h"
  566.  
  567. Then, there are a number of extern definitions based on #if
  568. directives. After the last one, place the following lines:
  569.  
  570.     #if NDP > 0
  571.     extern struct streamtab dp_ifinfo;
  572.     extern struct streamtab ppp_dialinfo;
  573.     extern struct streamtab ppp_asyncinfo;
  574.     #endif
  575.  
  576. Then, there is a fmodsw array defined.  This array defines all the
  577. streams modules in the system.  Near the end of this array,
  578. before the loadable modules are defined (VDDRV), put the
  579. following lines:
  580.  
  581.     #if NDP > 0
  582.         { "dpif", &dp_ifinfo },
  583.         { "pppdial", &ppp_dialinfo },
  584.         { "pppasync", &ppp_asyncinfo },
  585.     #endif
  586.  
  587. 4.2.4 /usr/sys/sun4c/conf/CONFIG_NAME
  588.  
  589. Each kernel is built from a configuration file with some name.  By
  590. default, when SunOS boots, it places that name in a comment in the
  591. file /etc/motd. You can tell which configuration was used to build
  592. the current system by looking at that file.
  593.  
  594. It is probably best to copy that configuration file to a new file,
  595. perhaps with "_DP" appended to the name.  For purposes of discussion,
  596. we will call the new configuration "SYS_DP".  Then edit the new
  597. configuration file and add the following lines:
  598.  
  599. #
  600. # Point to Point Protocol (PPP) devices
  601. #
  602. pseudo-device    dp    init    dp_attach
  603.  
  604. If you want more than one interface (like for a central hub), just
  605. put the number after "dp".  For instance, for 8 interfaces, use the
  606. line:
  607.  
  608. pseudo-device    dp8    init    dp_attach
  609.  
  610. 4.2.5 New Source Files
  611.  
  612. From the "sys" directory in the distribution, copy the following
  613. files to the "/usr/sys/os" directory:
  614.  
  615.     dp_if.c
  616.     ppp_async.c
  617.  
  618. From the "h" directory in the distribution, copy the following files
  619. to the "/usr/sys/sys" directory".
  620.  
  621.     dp_str.h
  622.     if_ppp.h
  623.     slip_var.h
  624.     slcompress.h
  625.  
  626. 4.2.6 Configuring and Compiling
  627.  
  628. In the directory "/usr/sys/sun4c/conf", run the command:
  629.  
  630.     /usr/etc/config SYS_DP
  631.  
  632. Use the name of the file you edited in the previous step in place of
  633. "SYS_DP". Then, change to the directory "../SYS_DP", and run make. 
  634. You should get a new kernel "vmunix".  In order to install the new
  635. kernel on your system, you should save a copy of the old kernel with
  636. "cp /vmunix /vmunix.old", then "cp /usr/sys/sun4c/SYS_DP/vmunix
  637. /vmunix".  Then, reboot using the "shutdown" or "reboot" command.
  638.  
  639. 4.2.7 Creating Devices
  640.  
  641. Only one new device needs created in the /dev directory.  This is the
  642. "pppdial" streams device that is used to pass dial requests from the
  643. kernel "dpif" module to the "dpd" program.  It should be created with
  644. a major number that is dependent on the exact contents of the
  645. "/usr/sys/sun/conf.c" file. For this example, we will assume the
  646. major number is 104.  These are the commands you would use:
  647.  
  648.     # /usr/etc/mknod /dev/dp0 c 104 0
  649.     # /usr/etc/chown root.staff /dev/dp0     chmod 600 /dev/dp0
  650.  
  651. 4.3 System Files
  652.  
  653. A number of system files need entries added according to your own
  654. setup. These files will be discussed here.
  655.  
  656. 4.3.1 /etc/passwd & /etc/group
  657.  
  658. This procedure may vary slightly depending on the use of NIS or
  659. shadow password files.  But, basically you will be defining users and
  660. groups much like you would for a new system user.  Feel free to adapt
  661. this procedure to your specific arrangement.
  662.  
  663. You should have defined a new group called "ppp" earlier in the
  664. installation if you used the loadable module support, otherwise
  665. assign a suitable id. In our case, we used the group id 600.  For
  666. each remote site that will be calling in, you need to create a login.
  667. We have used the convention that PPP logins all start with the
  668. letter 'P'.  This has made it easy to identify it as a "special" sort
  669. of login when looking at the output of "who" or "finger".
  670.  
  671. Assume that we have 2 remote sites: "rem1" and "rem2".  We have
  672. selected available user id's 601 and 602, respectively. 
  673. Additionally, we have selected group id 600 for group "ppp".  The
  674. "/etc/passwd" file entries would take the following form:
  675.  
  676.     Prem1:*:601:600:PPP Remote 1:/var/adm/dp:/usr/etc/dplogin
  677.     Prem2:*:602:600:PPP Remote 2:/var/adm/dp:/usr/etc/dplogin
  678.  
  679. The entry in the "/etc/group" file would look like this:
  680.  
  681.     ppp:*:600:Prem1,Prem2
  682.  
  683. After creating these entries, we would use the command "passwd Prem1"
  684. to set the password for the "Prem1" account, and similarily for
  685. "Prem2".
  686.  
  687. 4.3.2  /etc/rc.boot
  688.  
  689. At some point in the boot process, you must arrange to run ifconfig
  690. on all your "dp" interfaces.  Sun has arranged code in /etc/rc.boot
  691. to do all the ifconfig's automatically, but it needs minor
  692. modification to make it work. You can simply add the ifconfig lines
  693. directly in one of the rc files (before starting dpd), or you can
  694. modify /etc/rc.boot and use the Sun scheme. Here are the
  695. modifications necessary to /etc/rc.boot. The line:
  696.  
  697.     hostname="`shcat /etc/hostname.??0            2>/dev/null`"
  698.  
  699. needs changed to:
  700.  
  701.     hostname="`shcat /etc/hostname.?e0            2>/dev/null`"
  702.  
  703. Later, this file messes with IFS and then looks for files of the form
  704. "/etc/hostname.*".  The lines:
  705.  
  706.     IFS="$IFS."
  707.     set `echo /etc/hostname\.*`
  708.  
  709. need changed to:
  710.  
  711.     SIFS=$IFS
  712.     IFS="$IFS."
  713.     set `echo /etc/hostname\.*`
  714.        IFS=$SIFS
  715.  
  716. The line:
  717.  
  718.     ifconfig $1 "`shcat /etc/hostname\.$1`" netmask + -trailers up
  719.  
  720. needs changed to:
  721.  
  722.     ifconfig $1 `shcat /etc/hostname\.$1` netmask + -trailers up
  723.  
  724. In the file "/etc/hostname.dp0", you need to place the source and
  725. destination addresses for the first PPP link.  The source address is
  726. the address on the local machine, and the destination address is the
  727. address on the remote machine. These addresses can be hostnames from
  728. the hosts database or internet numeric dot notation.  Create one of
  729. these files for each PPP link.
  730.  
  731. 4.3.2 /etc/rc.local
  732.  
  733. After the "ifconfig" commands are run at boot time, before using the
  734. PPP interfaces for anything else, you must start the Dialup PPP
  735. Daemon (PPP). In /etc/rc.local, there is a line similar to:
  736.  
  737.     ifconfig -a netmask + broadcast + > /dev/null
  738.  
  739. Right after that line is a good place to start dpd.  The lines to add
  740. look like this:
  741.  
  742.     #
  743.     # Start Dialup PPP Daemon.
  744.     #
  745.     if [ -f /usr/etc/dpd -a -f /etc/dp/config/dp-conf ]; then
  746.         /usr/etc/dpd
  747.         echo 'starting Dialup PPP Daemon.'
  748.     fi
  749.  
  750. 4.3.4 /etc/hosts
  751.  
  752. In short, you need an entry in "/etc/hosts" for each "dp" interface.
  753. Each PPP link is a network in it's own right.  So, it to be assigned
  754. a unique internet IP number for each end.
  755.  
  756. For broadcast networks, a network address is assigned for each
  757. physical network. Host numbers are chosen for each host on the
  758. network.  For an example class C addresses 199.10.11.14 and
  759. 199.10.11.52 are both on the same IP network (199.10.11). These
  760. addresses represent hosts 14 and 52 on that network. IP routers know
  761. how to get to the 199.12.13 network and pass packets on to the
  762. appropriate gateway.  Once the packets get to that network, they are
  763. then routed to host 14, 52, or whatever.
  764.  
  765. In contrast, the number of hosts on a Point to Point network is
  766. always 2. So, in IP routing, we never actually use a route to the
  767. network.  We just use a route to each individual address (both ends).
  768. So, if we are administering several Point to Point networks, we can
  769. use a single IP network, and assign pairs of addresses.  For
  770. instance, assume we have a class C network 199.10.20 assigned for PPP
  771. links.  Our first link could have the addresses 199.10.20.1 and
  772. 199.10.20.101.  Our second link could have the addresses 199.10.20.2
  773. and 199.10.20.102.  We need two addresses for each link since we need
  774. to assign an address to each end.  Using addresses differing by 100
  775. for both ends of the link has proven to be a convenient convention
  776. for us. It helps us to keep track of things when dealing with a large
  777. central hub. 
  778. So, let's say we have a hub machine called "hub", with 2 PPP links,
  779. "dp0", and "dp1" serving the machines "rem1" and "rem2".  Each of
  780. these remote machines have a single PPP interface "dp0".  Using the
  781. addresses from the previous examples, we would have /etc/hosts
  782. entries as follows:
  783.  
  784.     199.10.11.14    hub hub-le0
  785.     199.10.20.101    hub hub-dp0
  786.     199.10.20.102    hub hub-dp1
  787.     199.10.20.1    rem1 rem1-dp0
  788.     199.10.20.2    rem2 rem2-dp0
  789.  
  790. These are just guidelines and address assignment can be done in a
  791. different ways based on local conventions and local politics.  In
  792. addition to the hosts file, many sites will also be using the DNS
  793. (Domain Name System). The DNS files need updated to reflect the new
  794. network addresses in a similar way.  In addition, routing can be
  795. quite different based on the protocols involved.  For further
  796. discussion about DNS and routing, see the later sections detailing a
  797. sample configuration.
  798.  
  799. 5.  Configuration
  800.  
  801. 5.1  "dp-conf" file
  802.  
  803. When, the programs "dpd" and "dplogin" are started, they read a
  804. configuration file "/etc/dp/config/dp-conf".  This file has a
  805. definition for each interface, each modem, and optionally a number of
  806. modem rotaries.
  807.  
  808. An definition of begins with a line beginning in the first column.
  809. Continuation lines must begin with white space (SPACE or TAB
  810. characters). Comments can be placed anywhere in a line and must begin
  811. with #. Strings can be delimited by double quote characters (""),
  812. if necessary.
  813.  
  814. For a given definition, each variable is given a value with a the
  815. variable name, an equal sign, and the value.  For instance, the first
  816. entry in the definition for the dp0 interface is:
  817.  
  818.     IF=dp0
  819.  
  820. This section defines all the possible options, their possible values,
  821. and gives some examples to show how they might be used.
  822.  
  823. 5.1.1  Interfaces
  824.  
  825. Each interface corresponds to a logical network connection to a
  826. single remote site.  Provisions are made in the interface definition
  827. to specify how calls should be made and received in order to handle
  828. traffic on that interface.
  829.  
  830. 5.1.1.1  IF
  831.  
  832. The IF variable must be the first entry in the interface definition.
  833. It's value is the name of the network interface (e.g. IF=dp0).
  834.  
  835. 5.1.1.2  SYS
  836.  
  837. The SYS variable can be optionally set to indicate a system name to
  838. be used when making log entries.  If the SYS variable is not
  839. explicitly set, it is defaulted to be the internet name of the
  840. remote site (as returned by gethostbyaddr()), or if that fails, the
  841. internet address of the remote site in dot notation.
  842.  
  843. 5.1.1.3  MODEMS
  844.  
  845. The MODEMS variable specifies the modems or modem rotaries that
  846. should be used to make calls for this interface.  At least one modem
  847. or modem rotary must be specified.  If more than one modem or modem
  848. rotary is specified, when a call request is made, each entry in the
  849. list is tried in turn until an available modem is found.  The names
  850. used in this list must correspond to a MODEM or ROTARY definition as
  851. specified in the configuration file.
  852.  
  853. 5.1.1.4  PHONE
  854.  
  855. The PHONE variable specifies the phone number that will be passed to
  856. the DIAL_SCRIPT as defined by the modem in use on a particular call.
  857.  
  858. 5.1.1.5  LOGIN_SCRIPT
  859.  
  860. The LOGIN_SCRIPT variable specifies an expect script that will be
  861. used to log into the remote system for the purposes of establishing a
  862. PPP connection. These scripts are found, by default, in
  863. "/etc/dp/script" and will be described in detail later.
  864.  
  865. 5.1.1.6  LOGIN_ARGS
  866.  
  867. The LOGIN_ARGS variable is a comma separated list of arguments to the
  868. expect script as defined by the value of LOGIN_SCRIPT.  This is
  869. typically the login and password on the remote machine.
  870.  
  871. 5.1.1.7  LOGIN
  872.  
  873. The LOGIN variable has practically nothing to do with the
  874. LOGIN_SCRIPT and LOGIN_ARGS variables, both of which deal with
  875. outgoing calls.  The LOGIN variable, instead, is set to allow a
  876. particular login id to be used to call in to establish a PPP
  877. connection.  When dplogin is called, it knows what account was used
  878. to log into the system.  It searchs the configuration file for an
  879. interface where the LOGIN variable is set to that same account.
  880.  
  881. 5.1.1.8  TRACE
  882.  
  883. The TRACE variable can be used to specify a trace file for the
  884. calling script.  If there is a problem with establishing a particular
  885. connection, this variable can be set to see what characters are being
  886. transfered when the DIAL_SCRIPT and LOGIN_SCRIPT are both run.
  887.  
  888. 5.1.1.9  ACCESS
  889.  
  890. An ACCESS file can be specified.  This file defines a number of
  891. additional variables and can be used to limit the conditions for
  892. which calls will be made.  This file is located, by default, in the
  893. "/etc/dp/config" directory. This file will be described in detail in
  894. the next section.
  895.  
  896. 5.1.1.10  PPP_ARGS
  897.  
  898. When the PPP program "dp" is started by dpd or dplogin, you can
  899. specify additional arguments to be put in the argument list.  For
  900. instance, if you are using dp.2.2 to talk to a dp.2.0 installation,
  901. the default header compression negotiation has changed with the new
  902. patch level of PPP. So, in the 2.2 configuration file, you can put
  903. the line:
  904.  
  905.     PPP_ARGS=vjmode,old
  906.  
  907. This will talk to a patchlevel 4 PPP correctly and the option negotiation
  908. will function properly.
  909.  
  910. 5.1.1.11  AUX
  911.  
  912. The AUX variable specifies an auxiliary program that will be run
  913. after a PPP link is established for a particular interface.  The
  914. default location for these programs is "/etc/dp/aux".  An example
  915. program is provided that checks the sendmail queue for queued
  916. messages.  This could be run to make sure mail messages are sent out
  917. whenever the link is established for any reason.
  918.  
  919. 5.1.1.12  AUX_ARGS
  920.  
  921. Arguments may be provided to AUX program by specifying them here as
  922. a comma separated list of arguments, much like the PPP_ARGS varialble.
  923. The last argument provided to the AUX script is always the system name
  924. from the SYS variable.
  925.  
  926. 5.1.1.13  LOG_LEVEL
  927.  
  928. The Log Level can be set when dpd is started.  The LOG_LEVEL variable
  929. overides the current log level for calls made to this system.  In addition,
  930. dplogin will set the same LOG_LEVEL for incoming calls.
  931.  
  932. 5.1.1.14  ASYNC_MAP
  933.  
  934. The PPP program can be setup to avoid using certain control characters in
  935. the case of links that aren't totally transparent.  This takes the form of
  936. a 8 digit hexadecimal string representing a 32 bit number.  The lowest
  937. to highest order bits of the number correspond to the ASCII character
  938. represented by 0 through 31.  If the bit is set, that character will
  939. not be transmitted on the line, but will instead be replaced by a special
  940. escape sequence.  By default, the ASYNC_MAP is set to 0, which means pass
  941. all characters since we have a totally transparent link.  This variable
  942. applies to all calls made to this system independent of which modem was used.
  943.  
  944. 5.1.2  Modems
  945.  
  946. A modem entry is required for each serial device that can be used to
  947. establish a connection to a remote system.
  948.  
  949. 5.1.2.1  MODEM
  950.  
  951. The MODEM variable must be the first entry in the modem definition.
  952. It's value is an arbitrary (hopefully descriptive) name.  This same
  953. name is used in the interface definition as a value for the MODEMS
  954. variable.
  955.  
  956. 5.1.2.2  DEV
  957.  
  958. The DEV variable is set to the physical serial device name path name.
  959.  If the entry does not begin with a "/", then it is assumed that the
  960. device appears in the "/dev" directory.  Sun has a scheme for using
  961. the same line for dial out and dial in.  For most configurations, you
  962. should use the name of the dial out device.  This is the one with the
  963. 0x80 bit set in the minor number. If necessary, you can make the
  964. dialout device for a given login port. As an example, assume we are
  965. using "ttya" and we want to make a dialout device "cua0". Here are
  966. some example commands run as root to make the device.
  967.  
  968.     # ls -lg /dev/ttya
  969.     crw--w--w-  1 root     wheel     12,   0 May 21 12:30 /dev/ttya
  970.     # /etc/mknod /dev/cua0 c 12 128
  971.     # chmod 660 /dev/cua0
  972.     # /etc/chown uucp.uucp /dev/cua0
  973.     # ls -lg /dev/ttya /dev/cua0
  974.     crw--w--w-  1 root     wheel     12,   0 May 21 12:30 /dev/ttya
  975.     crw-rw----  1 uucp     uucp      12, 128 May 21 12:30 /dev/cua0
  976.  
  977. Then, you would put "DEV=cua0" in your modem definitions to use this
  978. device.
  979.  
  980. 5.1.2.3  DIAL_SCRIPT
  981.  
  982. The DIAL_SCRIPT variable is the name of a script file.  By default,
  983. these files are located in "/etc/dp/script".  This script will be
  984. used to interact with the modem and make the call.  The phone number
  985. is passed as the first and only argument to the script.
  986.  
  987. The next section describes modem rotaries.  If all the modems in a
  988. rotary use the same DIAL_SCRIPT, it is not necessary to set each one
  989. individually.  The DIAL_SCRIPT variable is set from the ROTARTY
  990. definition.
  991.  
  992. 5.1.2.4  BAUD
  993.  
  994. The BAUD variable is the baud rate to use for outgoing calls on this
  995. modem.
  996.  
  997. The next section describes modem rotaries.  If all the modems in a
  998. rotary use the same baud rate, it is not necessary to set each one
  999. individually.  The BAUD variable is set from the ROTARTY definition.
  1000.  
  1001. 5.1.2.5  DIAL_CHARMAP
  1002.  
  1003. This variable is set in order to map characters embedded in phone numbers
  1004. to the appropriate modem control character.  For instance, it may
  1005. be a common practice to include a '=' in phone numbers when you have to
  1006. wait for a secondary dial tone and a '-' when you just have to pause for
  1007. a second.  For Telebit modems, then the mapping would be performed with:
  1008.  
  1009.     DIAL_CHARMAP==W-,
  1010.  
  1011. which means wait for dial tone is 'W', and a short pause is ','.
  1012. This allows modems of different brands to be used without undue
  1013. difficulty.
  1014.  
  1015. 5.1.2.6  ASYNC_MAP
  1016.  
  1017. The PPP program can be setup to avoid using certain control characters in
  1018. the case of links that aren't totally transparent.  This takes the form of
  1019. a 8 digit hexadecimal string representing a 32 bit number.  The lowest
  1020. to highest order bits of the number correspond to the ASCII character
  1021. represented by 0 through 31.  If the bit is set, that character will
  1022. not be transmitted on the line, but will instead be replaced by a special
  1023. escape sequence.  By default, the ASYNC_MAP is set to 0, which means pass
  1024. all characters since we have a totally transparent link.  This variable
  1025. applies to all calls made with this modem.
  1026.  
  1027. 5.1.3  Modem Rotaries
  1028.  
  1029. If you are administering a central hub machine with several modems,
  1030. you may wish to define a modem rotary.  When defining the interfaces,
  1031. you can set the modem variable to a list of modems (or rotaries). 
  1032. Each one will be tried in turn until an available modem if found. 
  1033. For a large number of modems, this is not very tolerant to hardware
  1034. failures.  If the first modem in the list is broken, calls will
  1035. always fail.  This approach is sometimes called using the "first
  1036. available" modem.
  1037.  
  1038. An alternative approach is to define modem rotaries.   A rotary is
  1039. best described as a "next available" approach.  The software keeps
  1040. track of the last modem used, and always starts with the next modem
  1041. in the list.  When the end of the list is reached, the first modem
  1042. becomes the next modem. This reduces overhead of finding a free modem
  1043. and insures that a bad modem will not totally shut down
  1044. communications.
  1045.  
  1046. 5.1.3.1  ROTARY
  1047.  
  1048. The ROTARY variable must be the first entry in the modem definition.
  1049. It's value is an arbitrary (hopefully descriptive) name.  This same
  1050. name is used in the interface definition as a value for the MODEMS
  1051. variable. Modems and rotaries can both be listed in the MODEMS
  1052. variable equally well.
  1053.  
  1054. 5.1.3.2  MODEMS
  1055.  
  1056. The MODEMS variable is set to a comma separated list of one or more
  1057. modems. The entries in the list are the names of the modems as
  1058. defined by their MODEM variable.  All entries in this list must be
  1059. modems.  Other rotaries cannot be used here.
  1060.  
  1061. 5.1.3.3  DIAL_SCRIPT
  1062.  
  1063. The DIAL_SCRIPT variable is the name of a script file.  By default,
  1064. these files are located in "/etc/dp/script".  This script will be
  1065. used to interact with the modem and make the call.  The phone number
  1066. is passed as the first and only argument to the script.
  1067.  
  1068. This entry will be used if the MODEM definition does not define a
  1069. DIAL_SCRIPT itself.  This is useful when a pool of modems are all the
  1070. same type and the DIAL_SCRIPT is the same for all of them.
  1071.  
  1072. 5.1.3.4  BAUD
  1073.  
  1074. The BAUD variable is the baud rate to use for outgoing calls on any
  1075. modem in this rotary.
  1076.  
  1077. This entry will be used if the MODEM definition does not define a
  1078. BAUD itself.  This is useful when a pool of modems are all the same
  1079. type and the baudrate is the same for all of them.
  1080.  
  1081. 5.1.3.5  DIAL_CHARMAP
  1082.  
  1083. This variable is set in order to map characters embedded in phone numbers
  1084. to the appropriate modem control character.  For instance, it may
  1085. be a common practice to include a '=' in phone numbers when you have to
  1086. wait for a secondary dial tone and a '-' when you just have to pause for
  1087. a second.  For Telebit modems, then the mapping would be performed with:
  1088.  
  1089.     DIAL_CHARMAP==W-,
  1090.  
  1091. which means wait for dial tone is 'W', and a short pause is ','.
  1092. If all the modems in a rotary are of the same brand, it is convenient
  1093. to set this variable in the rotary definition rather than setting it
  1094. in each modem definition.
  1095.  
  1096. 5.1.3.6  ASYNC_MAP
  1097.  
  1098. The PPP program can be setup to avoid using certain control characters in
  1099. the case of links that aren't totally transparent.  This takes the form of
  1100. a 8 digit hexadecimal string representing a 32 bit number.  The lowest
  1101. to highest order bits of the number correspond to the ASCII character
  1102. represented by 0 through 31.  If the bit is set, that character will
  1103. not be transmitted on the line, but will instead be replaced by a special
  1104. escape sequence.  By default, the ASYNC_MAP is set to 0, which means pass
  1105. all characters since we have a totally transparent link.  This variable
  1106. applies to all calls made with any modem in this rotary.  If all the modems
  1107. in a rotary are of the same brand, it is convenient to set this variable
  1108. in the rotary definition rather than setting it in each modem definition.
  1109.  
  1110. 5.2  Access Files
  1111.  
  1112. An access file can be defined to describe the conditions when a call
  1113. is permitted and to set the timeouts appropriately.  For instance, if
  1114. you have some sites that are long distance toll calls, and some that
  1115. are local calls, you may wish to have shorter timeouts on the toll
  1116. calls than on the locals.
  1117.  
  1118. The format of the access came from the BBN DialupIP software.  It has
  1119. been expanded in several ways, but it still looks pretty similar.
  1120. Aside from several small changes in the existing options, a series
  1121. of timeout specifications have been added.
  1122.  
  1123. 5.2.1 Timeouts
  1124.  
  1125. There are eight timeouts which can be specified, three that can
  1126. be set separately for incoming and outgoing calls, and 2 more that only
  1127. make sense for outgoing calls.  Here is a sample section from a access
  1128. file showing all 8 timeouts:
  1129.  
  1130.     #
  1131.     # Connection Timeouts
  1132.     #
  1133.     failedcall         25    # time to mark network as down after failed call
  1134.     callwait         50    # time to allow for call to go through
  1135.     #
  1136.     # Activity Timeouts
  1137.     #
  1138.     dial:inactivity    180    # time to let the connection sit idle
  1139.     dial:last_close      6    # fast timeout after last TCP close
  1140.     dial:non_tcp     10    # fast timeout for non-TCP traffic
  1141.     answer:inactivity    600    # time to let the connection sit idle
  1142.     answer:last_close    180    # fast timeout after last TCP close
  1143.     answer:non_tcp    180    # fast timeout for non-TCP traffic
  1144.  
  1145. Since we are not dialing 800 numbers, we are paying for calls made.
  1146. In that case, we set short timers so that disconnections are prompt.
  1147. For incoming calls, we set some limits just to keep the modem pool from
  1148. being tied up.
  1149.  
  1150. 5.2.1.1 Callwait
  1151.  
  1152. When the kernel "dpif" module requests a call be placed by "dpd", the
  1153. kernel starts the call wait timer.  If no status has been reported from "dpd"
  1154. within "Callwait" seconds, it is equivalent to receiving a "FAILURE" status
  1155. from "dpd".
  1156.  
  1157. 5.2.1.2 Failedcall
  1158.  
  1159. After a FAILURE status or after the expiration of the Callwait timer,
  1160. the interface is marked with the FAILEDCALL status.  With that status
  1161. set, no calls will be attempted.  After "Failedcall" seconds, the interface
  1162. status is marked as DISCON, and call attempts will again be made.
  1163.  
  1164. 5.2.1.3 Inactivity
  1165.  
  1166. If no packets have been sent or received through a PPP interface within
  1167. "Inactivity" seconds, PPP is terminated and the interface is marked as DISCON.
  1168.  
  1169. 5.2.1.4 Tcp_close
  1170.  
  1171. TCP packets contain information about connections starting and ending.
  1172. A count of active connections is maintained for each interface.  When
  1173. this count goes to zero, if no packets have been sent or received within
  1174. "Tcp_close" seconds, PPP is terminated and the interface is marked as DISCON.
  1175.  
  1176. 5.2.1.5 Non_tcp
  1177.  
  1178. When the active TCP connection count goes to zero, and non-TCP packets
  1179. are being transmitted, if no packets have been sent or received within
  1180. "Tcp_close" seconds, PPP is terminated and the interface is marked as DISCON.
  1181.  
  1182. 5.2.2 Protocols
  1183.  
  1184. We can limit the calls made by the protocol.  Here is a sample access
  1185. file entry that would only allow tcp, udp, and icmp packets:
  1186.  
  1187.     protocols    tcp udp icmp
  1188.  
  1189. The keyword "goodprotocols" can be used in place of "protocols".
  1190. In addition, the keyword "badprotocols" can be used to disallow calls
  1191. based on packets certain protocols.
  1192.  
  1193. Any protocol that is in the "/etc/protocols" file is a valid entry on this
  1194. line.  Please note that this only controls the initiation of a call request.
  1195. Once a call succeeds, other protocols can be transmitted.
  1196.  
  1197. 5.2.3 Times
  1198.  
  1199. By default, calls can be placed at any time.  If you wish to limit calls
  1200. during certain hours of certain days, you can place entries in the access
  1201. files containing the day and the hours when calls are should not be permitted.
  1202. The allowable days are:
  1203.  
  1204.     sun    sunday
  1205.     mon    monday
  1206.     tue    tuesday
  1207.     wed    wednesday
  1208.     thu    thursday
  1209.     fri    friday
  1210.     sat    saturday
  1211.     weekdays
  1212.     weekends
  1213.  
  1214. For instance, if calls should only be allowed during "business" hours of
  1215. monday through friday (8-5), with no calls in the evening or weekends,
  1216. you would use the following entries:
  1217.     
  1218.     weekdays    0 1 2 3 4 5 6 7 17 18 19 20 21 22 23 24
  1219.     weekends    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  1220.  
  1221. If a day is not mentioned either explicitly or via the weekday/weekend
  1222. keyword, then calls can be placed all day.
  1223.  
  1224. To allow calls only during times with lower rates, one might want to turn
  1225. off calls during the 8-5 business day.  This would be done with the following
  1226. line:
  1227.  
  1228.     weekdays    8 9 10 11 12 13 14 15 16
  1229.  
  1230. Calls would then be placed anytime before 8AM and after 5PM on weekdays
  1231. and any time on weekends.
  1232.  
  1233. 5.2.4 Hosts/Networks
  1234.  
  1235. To limit calls when certain hosts are involved, you can use further keywords.
  1236.  
  1237. In order to limit calls to packets which are destined to a list of specific
  1238. hosts, you would use the "allowto" (or equivalently "gooddstaddresses")
  1239. keyword.  If the access file has a line of this form, a call will fail for
  1240. packets having destination addresses not in this list.  So, if we wish
  1241. calls to be placed for only one hosts on the 192.100.10.0 network and the
  1242. goodhost.com host, a line of the following form would be used:
  1243.  
  1244.     allowto    192.100.10.0 goodhost.com
  1245.  
  1246. In order to limit where a packet may come from, you can use the "disallowfrom"
  1247. (or equivalently "badsrcaddresses") keyword.  If a call request is made
  1248. for a packet coming from an address in this list, then the call fails.
  1249. An example would be
  1250.  
  1251.     disallowfrom    badhost.edu
  1252.  
  1253. The addresses given in these lists can be the name of a network, the
  1254. name of a host, or equivalently an internet host or network address in
  1255. dot notation.
  1256.  
  1257. 5.3  Script Files
  1258.  
  1259. The script mechanism is used by the dpd program to interact with modems
  1260. and systems to make calls and log in to remote computers.  They provide a
  1261. full send-expect style facility, with many extensions to allow for
  1262. timeouts, alternative choices and others.  This is a direct extension
  1263. of the DialupIP 2.0 script file mechanism with the following additions:
  1264.  
  1265. - Two separate scripts are required for dialing and for login.
  1266.  
  1267. - Timeouts can be 0 to indicate matches of previously received data (via a
  1268.   mark/replay command pair).
  1269.  
  1270. - "recv" commands can match more than one alternative string
  1271.  
  1272. Script files contain a sequence of lines, each with a command and zero or
  1273. more arguments.  Blank lines and lines beginning with # are ignored.
  1274. Strings must be quoted with double quotes (") if they contain white space.
  1275. Standard C escape sequences are valid (\b, \f, \n, \r, \t, or \000 where 000
  1276. is any octal number).
  1277.  
  1278. Several example script files are provided in the distribution for dialing
  1279. several different Telebit modems directly into a remote system as follows:
  1280.  
  1281. t1600-dial    Dials the given number on a Telebit T1600 modem.
  1282. t3000-dial    Dials the given number on a Telebit T3000 modem.
  1283. wb-dial        Dials the given number on a Telebit WorldBlazer modem.
  1284. ppp-login    Logs into a remote system directly.  The first argument
  1285.         is a login, and the second argument is the password.
  1286.         This assumes the login shell on the remote system is "dplogin",
  1287.         and performs simple synchronization with that program.
  1288.  
  1289. 5.3.1 abort
  1290.  
  1291. The "abort" command terminates the script with a failure code returned.
  1292. Reading the script past the end of file is equivalent to the "abort" command.
  1293.  
  1294. 5.3.2 go
  1295.  
  1296. The "go" command indicates success.  For a dial script, success means
  1297. that the call went through using the specific modem.  For a login script,
  1298. success means that PPP is started on the remote computer.
  1299.  
  1300. 5.3.3 log "text"
  1301.  
  1302. This writes the given string to the log file (by default, /var/adm/dp/dp.log).
  1303.  
  1304. 5.3.4 mark
  1305.  
  1306. As incoming bytes are received, they are saved in a buffer for possible later
  1307. use by "replay".  The mark command indicates the beginning of where to start
  1308. saving characters.
  1309.  
  1310. 5.3.5 replay
  1311.  
  1312. Characters in the incoming buffer are replayed as if they are being received
  1313. again.  This replay starts at the most recent mark command.
  1314.  
  1315. 5.3.6 recv "text" [ "text" ... ] timeout
  1316.  
  1317. The recv command is used to examine the incoming characters (which can be
  1318. actual new characters, or older ones after a replay command.  The command
  1319. succeeds when a substring of the incoming characters matches one of the
  1320. "text" patterns given.  If the match has not succeeded in "timeout" seconds,
  1321. the "recv" command returns failure.  However, if the "recv" command is in
  1322. a "select block", control is passed to the next alternative.
  1323.  
  1324. 5.3.7 use script [ "parameter" ... ]
  1325.  
  1326. The use command executes another script file and returns success or failure
  1327. depending on the execution of the named script.
  1328.  
  1329. 5.3.8 xmit "text"
  1330.  
  1331. This sends the indicated text to the remote system.  A \x in the string
  1332. will delay 1 second, and a \# will send a break.
  1333. Also, the string $1 will be replaced by the first argument to the script,
  1334. and so on.  The arguments are given in the dp-conf file or as arguments
  1335. the the "use" command.
  1336.  
  1337. 5.3.9 Select Blocks
  1338.  
  1339. Select blocks allow you to specify alternatives on failure of specific
  1340. "recv" commands.
  1341.  
  1342. The format is as follows:
  1343.  
  1344.     {
  1345.     alternate
  1346.         commands...
  1347.     alternate
  1348.         commands...
  1349.     }
  1350.  
  1351. The "{", "}", and "alternate" keywords are commands and must be on separate
  1352. lines.  If a "recv" command fails, then control is passed to the next
  1353. alternate.  If all alternatives fail, then the select block returns a
  1354. failure, and is equivalent to an "abort".
  1355.  
  1356. 6.  Routing
  1357.  
  1358. There are two ways, in general, that you will connect systems
  1359. together with dp. The first is a single machine (typically at home)
  1360. to a network of systems (the office network or maybe the Internet)
  1361. and second to connect two networks (two sites for example, or an
  1362. office network to the Internet).
  1363.  
  1364. In either case, the networking software has to know how to get to the
  1365. "other" systems. This is done in the kernel by routing tables. There
  1366. is at least one route to each interface, but the administrator (you)
  1367. can add more.
  1368.  
  1369. 6.1 Static Routing
  1370.  
  1371. Where there is a single machine and a remote network or two
  1372. reasonably stable networks which are under your administrative
  1373. control, then the simplest way of setting things up is to use static
  1374. routes.
  1375.  
  1376. Again, in the Unix way there is always more than one way of doing
  1377. things, and this is true for installing route into the kernel. 
  1378.  
  1379. 6.1.1 "route"
  1380.  
  1381. The most direct way to install a new route is the use the route(8)
  1382. command. "route" will allow you, as superuser, to add and delete
  1383. routes in the kernel. There are three (really two) types of route:
  1384.  
  1385. *    Route to a host. This type of route effectively says: you can get
  1386. to this host via this interface.
  1387.  
  1388. *    Route to a network. This type says there is a network over there,
  1389. past that interface on the left :-)
  1390.  
  1391. *    The default route. The is a special route that is used as a catch
  1392. all. It is most useful for a single host (home) connecting to
  1393. everything else and tells the networking software to route everything
  1394. down a single line if the is no other explicit route for it.
  1395.  
  1396. As an example, let's say that a home system is connected to a work system
  1397. via a PPP link.  "home.com" has the PPP interface of 192.220.10.1
  1398. "work.com" has the PPP interface 192.220.10.2 and the ethernet interface
  1399. 192.220.11.18.  In order to another machine on the work ethernet to get to
  1400. the home system, it would need the command
  1401.     
  1402.     /usr/etc/route add 192.220.10.1 192.220.11.18 1
  1403.  
  1404. In order for the home system to reach other hosts on the work ethernet,
  1405. it would need the command:
  1406.  
  1407.     /usr/etc/route add 192.220.11.0 192.220.10.2 1
  1408.  
  1409. Assume now that the ethernet is connected to other networks or the Internet.
  1410. Then, the best command for home.com would be:
  1411.  
  1412.     /usr/etc/route add default 192.220.10.2 1
  1413.  
  1414. This would route all remote packets through the PPP interface.
  1415.  
  1416. 6.1.2 "/etc/gateways"
  1417.  
  1418. The other method is to create a file called "/etc/gateways" that
  1419. lists static route available at boot time (more correctly when the
  1420. routing daemon is started).
  1421.  
  1422. This file is read when "in.routed" is started in "/etc/rc.local".
  1423. For further information, see the routed(8c) manual page.
  1424.  
  1425. 6.2 Dynamic Routing
  1426.  
  1427. In the case where two networks are connected, and these may have
  1428. further connections added to them or taken away,  then there must be
  1429. a way for the routing information to be updated at regular intervals
  1430. so that packets can get to their intended destinations.
  1431.  
  1432. 6.2.1 Routed
  1433.  
  1434. Routed(8c) has been used extensively for adapting routes to changing network
  1435. connectivity.  It will work in this case of PPP links.  Routed works by sending
  1436. RIP packets (Routing Information Protocol) on every interface every 30 seconds.
  1437. Clearly, if we wish to disconnect the phone when our interface is not in use,
  1438. this will cause problems.  For this reason, routed is probably not the best
  1439. choice for routing on hosts with dialup PPP interfaces, unless the intent
  1440. is to keep the phones connected all the time.
  1441.  
  1442. 6.2.1 Gated
  1443.  
  1444. Gated is a program that knows about routing via several protocols.
  1445. It can handle RIP (routed) packets, as well as other protocols such
  1446. as EGP (External Gateway Protocol) and GGP (Gateway to Gateway Protocol).
  1447. It also can be used to consider certain routes as "static" and to be always
  1448. available.  These routes can then be advertised using any of the available
  1449. routing protocols, including RIP.
  1450.  
  1451. If you have RIP based routing, then gated can be easily set up on your
  1452. hub machine up to use static routing for the PPP links and use RIP for
  1453. the other (ethernet?) networks.
  1454.  
  1455. Here is an example gated configuration file for our campus hub that talks
  1456. to 6 remote systems, each with a local ethernet at the other end:
  1457.  
  1458.     #
  1459.     #    Config file gated on phoenix.acn.purdue.edu
  1460.     #
  1461.     traceoptions internal external route rip update ;
  1462.     #tracefile "/tmp/gated.trace" ;
  1463.  
  1464.     interface all passive ;        # don't time out my interfaces!
  1465.  
  1466.     #
  1467.     # Do rip except on the PPP interfaces
  1468.     #
  1469.     rip supplier {
  1470.     interface dp0 noripout noripin ;
  1471.     interface dp1 noripout noripin ;
  1472.     interface dp2 noripout noripin ;
  1473.     interface dp3 noripout noripin ;
  1474.     interface dp4 noripout noripin ;
  1475.     interface dp5 noripout noripin ;
  1476.     } ;
  1477.  
  1478.     #
  1479.     # Set up static routes to remote ethernets at the end of PPP links
  1480.     # We are advertising ourself as a gateway to the subnetwork assigned
  1481.     # to the PPP links.  For each remote ethernet, the remote end of a PPP
  1482.     # link is being advertised as a gateway.
  1483.     #
  1484.     static {
  1485.     128.46.177.0 gateway 128.46.157.167 ;    # PPP Links
  1486.     128.46.34.0  gateway 128.46.177.34 ;    # Remote ethernet
  1487.     128.46.181.0 gateway 128.46.177.43 ;    # Remote ethernet
  1488.     128.46.176.0 gateway 128.46.177.49 ;    # Remote ethernet
  1489.     128.46.182.0 gateway 128.46.177.50 ;    # Remote ethernet
  1490.     128.46.84.0  gateway 128.46.177.84 ;    # Remote ethernet
  1491.     } ;
  1492.  
  1493.     #
  1494.     # Send out all sorts of interesting information in RIP packets
  1495.     #
  1496.     propagate proto rip {
  1497.     #
  1498.     # Propagate anything learned via RIP
  1499.     #
  1500.     proto rip ;
  1501.     #
  1502.     # Propagate static routes to county ethernets
  1503.     # Technically, the metric for remote ethernets should be 2,
  1504.     # but 1 works better in this scenario since there are no alternate
  1505.     # routes anyway, especially direct routes.
  1506.     #
  1507.     proto static metric 1 ;
  1508.     #
  1509.     # Propagate routes to all connected interfaces
  1510.     #
  1511.     # proto direct metric 1 ;
  1512.     } ;
  1513.  
  1514.     #
  1515.     # We don't have SNMP configured in
  1516.     #
  1517.     #snmp no ;
  1518.  
  1519. We are using gated 2.1 and it is available via anonymous ftp from
  1520. gated.cornell.edu in the file "pub/gated/gated/gated.tar.Z".
  1521. It works quite well in our configuration.
  1522.  
  1523. 7. Tuning
  1524.  
  1525. You need to set up your "/etc/dp/config/dp-conf" file and any script
  1526. and access files for what makes sense in your environment.  The primary
  1527. tuning comes in getting your dialing scripts to work, selecting appropriate
  1528. timeouts in your access file, and monitoring what happens.
  1529.  
  1530. The file /var/adm/dp/call.log can be used to give you a one line
  1531. summary of each successful call.  The file /var/adm/dp/dp.log can be used
  1532. to show you a blow by blow description of calls in progress.  The amount
  1533. of logging can be increased by invoking dpd with "-d N" where N can be anywhere
  1534. from 0 for minimal logging to 3 for verbose logging.  In addition, the log
  1535. level can be set for individual systems in the configuration file.
  1536.  
  1537. If you encounter problems with the kernel modules, you can turn on very
  1538. verbose debugging output by setting the following kernel variables:
  1539.  
  1540. dpif streams module
  1541.     dp_if_debug            General info
  1542.     dp_ftimo_debug        Fast timeout mechanism
  1543.     dp_active_debug        TCP connection status
  1544.  
  1545. pppdial streams module
  1546.     ppp_dial_debug        General info
  1547.  
  1548. pppasync streams module
  1549.     ppp_async_debug        General info
  1550.     ppp_async_input_debug    input packet dump of N bytes
  1551.  
  1552. These variables are all "int" variables and should be set to 0 or 1, to have
  1553. the reporting off or on, respectively.  The ppp_async_input_debug variable
  1554. can be given a value greater than 1 to indicate the number of bytes printed in
  1555. a packet trace.
  1556.  
  1557. As an example, to set ppp_async_input_debug variable to 32, run
  1558. "adb -k -w /vmunix /dev/mem".  Then, type "ppp_async_input_debug/W0t32",
  1559. then to get out of adb, type a control-D.
  1560.  
  1561. 7.1 Broadcast programs
  1562.  
  1563. Some programs broadcast information on a regular basis to all connectected
  1564. interfaces.  If a program is found to generate frequent output on PPP
  1565. interfaces, it should be reconfigured, modified, or just not run at all,
  1566. depending on the circumstances.
  1567.  
  1568. 7.1.1 rwhod
  1569.  
  1570. A common example of a talkative program is rwhod.  If you must run rwhod,
  1571. it should be modified to ignore PPP links.  Context diffs for rwhod are
  1572. available on phoenix.acn.purdue.edu in pub/rwhod.diffs.Z.  Once applying
  1573. these diffs to rwhod sources, you should be able to run rwhod with the
  1574. "-p" flag to suppress all output on Point to Point interfaces.
  1575.  
  1576. 7.2 Nameserver
  1577.  
  1578. If you are on the Internet, you pretty much are mandated to use DNS.
  1579. If you are relying solely on DNS (no NIS or host tables), you should
  1580. set up nameservers at the remote sites. Care should be taken in the
  1581. configuration of the nameservers.  There are at least a couple of ways
  1582. that you can set things up.
  1583.  
  1584. 7.2.1 Secondary nameservers 
  1585.  
  1586. You can set up secondary nameservers on each of the remote sites.
  1587. They can zone load your organization wide zones on a regular basis.
  1588. Please note that zones have a refresh time at which point a connection
  1589. will be made to check for updates.  This can vary, but it may be 12 hours
  1590. or so.  This interval is specified in the zone file on the primary nameserver.
  1591. At this interval, the remote secondary nameserver will contact the primary
  1592. nameserver (generating a call in our case).  It will verify that it has
  1593. the most recent version of each zone of interest.
  1594.  
  1595. 7.2.2 Primary nameservers
  1596.  
  1597. For remote sites that are placing toll calls, a refresh interval of 12
  1598. hours would result in 2 extra toll calls per day.  This may be a problem.
  1599. If so, consider making the remote system a primary nameserver.  When the
  1600. central nameserver file is updated, it needs distributed to all remote
  1601. primary nameservers, but this may be manageable compared to all the long
  1602. distance toll charges of the more automatic scheme employed by the secondary
  1603. nameservers.
  1604.  
  1605. In general the remote primary servers should not be listed in the
  1606. nameserver data contained in the zone data.  Otherwise, distant Internet hosts
  1607. may try to use them for information about the zone, generating unnecessary
  1608. traffic.  They should exist as primary nameservers, but not be advertised
  1609. as such.
  1610.  
  1611. 8. Future work
  1612.  
  1613. A few areas are slated for future work as time permits.
  1614.  
  1615. We will continue to track the Point to Point Protocol as it is updated
  1616. and newer versions are made available
  1617.  
  1618. With slow links, there are some problems with the combination of
  1619. bursty interactive traffic and large batch file transfer traffic.
  1620. A future release will implement Type of Service (TOS) priority queueing
  1621. to give priority to interactive packets.  This should help interactive
  1622. response on heavily loaded links.
  1623.  
  1624. We would like to add some administrative tools that can give a better
  1625. picture of the traffic patterns over periods of time.  For instance,
  1626. it would be useful to have a report showing how many calls were placed
  1627. for what protocol, sorted by number of calls, for a given month.
  1628.  
  1629. Peter Galbavy is now working on modifications to do synchronous 64 Kbps
  1630. with the SPARCstation on board serial port.
  1631.  
  1632. Further updates to this document will be made as we get feedback from
  1633. people using the software.
  1634.  
  1635. Support for other platforms will be integrated as interested parties provide
  1636. the ports.
  1637.  
  1638. Support for Solaris 2.0 will come as it becomes generally available.
  1639.  
  1640. 9. Credits
  1641.  
  1642. The bulk of the work has been done at Purdue University by Kirk Smith
  1643. (ks@acn.purdue.edu) and has been supported by the Purdue Agricultural
  1644. Computer Network.  The Purdue ACN is responsible for networking 96
  1645. remote computers to the campus internet.  Right now, 5 remote sites are
  1646. in operation and more will come on line as Sun equipment is purchased.
  1647.  
  1648. Peter Galbavy of Micromuse Ltd. (Peter.Galbavy@micromuse.co.uk) has provided
  1649. invaluable help in several areas.  Among these, were the loadable module
  1650. support, integration of newer PPP revisions, significant work on this document,
  1651. and much testing and several bug fixes.
  1652.